{
static DECLARE_WORK(shutdown_work, __shutdown_handler, NULL);
- int type = -1;
+ char *str;
+ unsigned int len;
- if (!xenbus_scanf("control", "shutdown", "%i", &type)) {
- printk("Unable to read code in control/shutdown\n");
+ str = (char *)xenbus_read("control", "shutdown", &len);
+
+ if (! len) {
return;
- };
+ }
xenbus_printf("control", "shutdown", "%i", SHUTDOWN_INVALID);
- if ((type == SHUTDOWN_POWEROFF) ||
- (type == SHUTDOWN_REBOOT) ||
- (type == SHUTDOWN_SUSPEND)) {
- shutting_down = type;
+ if (strncmp(str, "poweroff", len) == 0) {
+ shutting_down = SHUTDOWN_POWEROFF;
+ } else if (strncmp(str, "reboot", len) == 0) {
+ shutting_down = SHUTDOWN_REBOOT;
+ } else if (strncmp(str, "suspend", len) == 0) {
+ shutting_down = SHUTDOWN_SUSPEND;
+ } else {
+ printk("Ignoring shutdown request: %s\n", str);
+ shutting_down = SHUTDOWN_INVALID;
+ }
+
+ kfree(str);
+
+ if (shutting_down != SHUTDOWN_INVALID) {
schedule_work(&shutdown_work);
}
char sysrq_key = '\0';
if (!xenbus_scanf("control", "sysrq", "%c", &sysrq_key)) {
- printk("Unable to read sysrq code in control/sysrq\n");
+ printk(KERN_ERR "Unable to read sysrq code in control/sysrq\n");
return;
}
up(&xenbus_lock);
if (err1) {
- printk("Failed to set shutdown watcher\n");
+ printk(KERN_ERR "Failed to set shutdown watcher\n");
}
#ifdef CONFIG_MAGIC_SYSRQ
if (err2) {
- printk("Failed to set sysrq watcher\n");
+ printk(KERN_ERR "Failed to set sysrq watcher\n");
}
#endif
- return NOTIFY_STOP;
+ return NOTIFY_DONE;
}
static int __init setup_shutdown_event(void)
DOMAIN_CRASH : "crash",
}
-"""Map shutdown reasons to codes
-"""
-shutdown_codes = {
- 'poweroff' : DOMAIN_POWEROFF,
- 'reboot' : DOMAIN_REBOOT,
- 'suspend' : DOMAIN_SUSPEND,
- }
-
RESTART_ALWAYS = 'always'
RESTART_ONREBOOT = 'onreboot'
RESTART_NEVER = 'never'
self.channel.writeRequest(msg)
def shutdown(self, reason):
- reasonid = shutdown_codes.get(reason)
- if reasonid == None:
+ if not reason in shutdown_reasons.values():
raise XendError('invalid reason:' + reason)
db = self.db.addChild("/control");
- db['shutdown'] = '%i' % reasonid;
+ db['shutdown'] = reason;
db.saveDB(save=True);
if not reason in ['suspend']:
self.shutdown_pending = {'start':time.time(), 'reason':reason}